/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkg1ifxServidorTcp;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketTimeoutException;
import javax.swing.DefaultListModel;
import pkg1ifxArchivos.cIfxProtocolo;
import pkg1ifxArchivos.cifxLogs;

/**
 *
 * @author strailaparicio
 */
public class cifxClieConConsol extends cIfxClientesCon {
    
        //Consola
    private javax.swing.JList lstMensajes;
    private javax.swing.JList lstAgentes;
    private cifxAgentes oagentes;
    private javax.swing.JTextField txtBuscar;
    private DefaultListModel olistademensajes;
    private DefaultListModel olmagentes;
    private boolean trabajarconconsola=false;
    
    public cifxClieConConsol(Socket socket,cIfxServidor servirdor,cifxLogs log)
    {
        super(socket, servirdor, log);
        
    }
    
    @Override
    public void run()
    {
        runConsola();
    }
    
    private synchronized void runConsola()
    {
        try {
                //Variable para controlar que acaba de salir de un IFX-Put
                // "+sdireccionipagenete+"
                boolean bSalirNo=false;
                //Activo los flujos para entrada salida de datos
                PrintWriter out = new PrintWriter(puerto.getOutputStream(), true);
                BufferedReader in = new BufferedReader(
                                        new InputStreamReader(puerto.getInputStream()));
                //Variables para el manejo de de los mensajes de entrada salida
                sdireccionipagenete=puerto.getInetAddress().toString();
                olog.outMensaje("cifxClieConConsol: Entrando conexion con IP:"+sdireccionipagenete);

                String inputLine, outputLine;
                cIfxProtocolo kkp = new cIfxProtocolo();
                outputLine = kkp.procesarES("IFX-Saludo");
                out.println(outputLine);

                while (true) {

                    if(scadenaperdida.length()>0)
                    {
                       inputLine=scadenaperdida;
                       scadenaperdida="";
                    }
                    else
                    {
                        inputLine = in.readLine();
                        if(inputLine == null)
                            break;
                    }


                    olog.outMensaje("cifxClieConConsol.run(): "+sdireccionipagenete+" Entrando Comando: "+inputLine);
                    outputLine = kkp.procesarES(inputLine);

                    if(outputLine.equals("IFX-DatosAgente"))
                    {
                        //puerto.
                        snombreagente=kkp.getNombreAgente();
                        //Strail solo para la consola ofrmgral.setAgenteNuevoEnLista(kkp.getNombreAgente()+" | " +sdireccionipagenete);

                    }
                    else if(outputLine.equals("IFX-Servidor"))
                    {
                        sultimomsj="IFX-Servidor";

                    }
                    else if(outputLine.equals("IFX-Cmd"))
                    {
                        sultimomsj=kkp.getUltimoMsj();
                        cifxCmd ocmd = new cifxCmd(sultimomsj);
                        ocmd.start();

                        while(!ocmd.HayResultados())
                            System.out.print("");

                        outputLine=ocmd.getResultados()+ "IFX-Cmd ("+ocmd.getNomFileResult()+")";
                        //outputLine+="\n";

                    }
                    else if(outputLine.equals("IFX-Msj"))
                    {
                        //cIfxDatosMSJ omsj=new cIfxDatosMSJ();
                        //kkp.getUltimoMsj().
                        sultimomsj=kkp.getUltimoMsj();
                        omsj.convCadEnMsj(sultimomsj);
                        if(trabajarconconsola)
                            setMsjAgente(omsj);

                    }

                    else if(outputLine.equals("IFX-Mensaje"))
                    {
                        sultimomsj=kkp.getUltimoMsj();
                        //ofrmgral.setMsjConsola(kkp.getUltimoMsj());

                    }
                    else if(outputLine.equals("IFX-Put"))
                    {
                        //IFX-Put nombre archivo|tamaño|path destino
                        sultimomsj=kkp.getUltimoMsj();
                        odarchivo.ConvCad(sultimomsj);
                        //Hago el cambio de funciones para la prueba
                        //leerGuardarBytes();
                        leer_BytesGuardar();

                         olog.outMensaje("cifxClieConConsol.run(): "+sdireccionipagenete+"Se ha terminado de leer archivo");

                        outputLine="";
                        //Probando a desconectar para evitar problemas
                        break;
                       

                    }
                    else if(outputLine.equals("IFX-Get"))
                    {
                        //IFX-Get nombre archivo
                        sultimomsj=kkp.getUltimoMsj();

                        leerEnviarBytes(sultimomsj.trim(),getPuerto());

                        olog.outMensaje("cifxClieConConsol.run(): "+sdireccionipagenete+"Se ha terminado de enviar archivo");
                        outputLine="";
                        //Probando a desconectar para evitar problemas
                        break;
                        
                    }
                    else if(outputLine.equals("IFX-putASCII"))
                    {
                        //IFX-Put nombre archivo|tamaño|path destino
                        sultimomsj=kkp.getUltimoMsj();
                        odarchivo.ConvCad(sultimomsj);
                        //Hago el cambio de funciones para la prueba
                        //leerGuardarBytes();
                        //Strail 08/08/2011 Comentario a la funcion de los ascii
                        //leer_BytesGuardarASCII();
                        //leer_BytesGuardarBlancoASCII();
                        leer_putASCII();

                         olog.outMensaje("cifxClieConConsol.run(): "+sdireccionipagenete+"Se ha terminado de leer archivo");

                        outputLine="";
                        //Probando a desconectar para evitar problemas
                        break;

                    }                        
                    else if(outputLine.equals("IFX-Desconectando ..."))
                    {
                        out.println(outputLine);
                        //olog.outMensaje("cIfxClientesCon: Desconectando IP:"+sdireccionipagenete);
                        outputLine="";
                        break;

                    }
                    else if(outputLine.equals("IFX-InfFile"))
                    {
                        sultimomsj=kkp.getUltimoMsj().trim();
                        
                        File forigen = new File(sultimomsj);
                        if(forigen.exists())
                        {
                            outputLine=String.valueOf(forigen.length());
                        }
                        else
                           outputLine="0"; 
                        //out.println(outputLine);
                        //olog.outMensaje("cIfxClientesCon: Desconectando IP:"+sdireccionipagenete);
                        //break;

                    }
                    //STR-Esta sentencia envia datos al cliente
                    olog.outMensaje("cifxClieConConsol.run(): "+sdireccionipagenete+" Enviandole Respuesta:"+outputLine);
                    if(outputLine.length()>0)
                    {
                        
                        out.println(outputLine);
                        out.flush();
                        break;
                    }


                    out.flush();

                }
                out.close();
                in.close();
                puerto.close();
                olog.outMensaje("cifxClieConConsol: Desconectando IP:"+sdireccionipagenete);
                oservirdor.QuieroSalir(nllave);

	}catch(SocketTimeoutException tex)
        {
            olog.outMensaje("cifxClieConConsol.run(): Time out :"+tex.getMessage());
            olog.outMensaje("cifxClieConConsol: Desconectando IP:"+sdireccionipagenete);
            oservirdor.QuieroSalir(nllave);
        }
        catch (IOException e) {
	    olog.outMensaje("cifxClieConConsol.run(): "+sdireccionipagenete+" ERROR:"+e.getMessage());
            oservirdor.QuieroSalir(nllave);
	}
    }
    
    public void setTrabajaConsola(boolean dato)
    {
        trabajarconconsola=dato;
    }
    public void setJlistAgentes(javax.swing.JList lst)
    {
       lstAgentes=lst; 
    }
    public javax.swing.JList getJlistAgentes()
    {
        return lstAgentes;
    }
    public void setListModelMensajes(DefaultListModel lmdl)
    {
        olistademensajes=lmdl;
    }
    
    public DefaultListModel getListModelMensajes()
    {
        return olistademensajes;
    }
    
    public void setListModelAgentes(DefaultListModel lmdl)
    {
        olmagentes=lmdl;
    }
    
    public DefaultListModel getListModelAgentes()
    {
        return olmagentes;
    }
    public void setAgentes(cifxAgentes agentes)
    {
        oagentes=agentes;
    }
    public cifxAgentes getAgentes()
    {
        return oagentes;
    }
    
    public void setTxtBuscar(javax.swing.JTextField txt)
    {
        txtBuscar=txt;
    }
    public javax.swing.JTextField getTxtBuscar()
    {
        return txtBuscar;
    }
    public void setJlistMensajes(javax.swing.JList lst)
    {
       lstMensajes=lst; 
    }
    public javax.swing.JList getJlistMensajes()
    {
        return lstMensajes;
    }
    
        //Consola
    
    public synchronized void setMsjAgente(cIfxDatosMSJ odmsj)
    {
        if(oagentes.buscarAgente(odmsj.getNombreAgente())!=null)
        {
            agregaMsg(odmsj);
            poneMensageEnLista(odmsj);
            
            
        }
        else
        {
            agregaAgente(odmsj);
            setAgenteNuevoEnLista(odmsj.getNombreAgente());
            poneMensageEnLista(odmsj);
            
        }
        
        
    }
    
    public synchronized void setAgenteNuevoEnLista(String sagente)
    {
        if(olmagentes.indexOf(sagente)<0)
        {
            
            olmagentes.addElement(sagente);
            lstAgentes.setModel(olmagentes);
        }
        //setIconRed(1);
        
      
    }
    
    public synchronized void agregaAgente(cIfxDatosMSJ odmsj)
    {
        cifxAGENTE oAGENTE = new cifxAGENTE();
        oAGENTE.addOMsj(odmsj);
        oagentes.agregaAgente(oAGENTE);
        
        
        /*cIfxAGENTE[] oagtmp = new cIfxAGENTE[oagentes.length];
        System.arraycopy(oagentes, 0, oagtmp, 0, oagentes.length);
        oagentes = new cIfxAGENTE[oagentes.length+1];
        System.arraycopy(oagtmp, 0, oagentes, 0, oagtmp.length);
        
        oagentes[oagentes.length-1] = new cIfxAGENTE();
        oagentes[oagentes.length-1].addOMsj(odmsj);*/
        
        
    }
    
    public synchronized void setMsjConsola(String smsj)
    {
        //this.txtMensajes.setText( this.txtMensajes.getText()+smsj + "\n");
        //Aqui valido si el mensage que entra contiene algo que se esta buscando si es asi
        //Lo pongo en la consola y lo guardo en el archivo de busqueda
        
        if(!txtBuscar.getText().equals("Buscar..."))
        {
           if(smsj.contains(txtBuscar.getText()))
           {
                olistademensajes.addElement(smsj);

                lstMensajes.setModel(olistademensajes);
                lstMensajes.setSelectedIndex(olistademensajes.getSize()-1);
                lstMensajes.ensureIndexIsVisible(olistademensajes.getSize()-1);
                
                
           }
        }
        else
        {
            olistademensajes.addElement(smsj);
            
            lstMensajes.setModel(olistademensajes);
            lstMensajes.setSelectedIndex(olistademensajes.getSize()-1);
            lstMensajes.ensureIndexIsVisible(olistademensajes.getSize()-1);
            
            
        }

        
    }
    
    public synchronized void poneMensageEnLista(cIfxDatosMSJ odmsj)
    {
        setMsjConsola(
                    odmsj.getFechaMsj()+", "+
                    odmsj.getTipoIFX()+", "+
                    odmsj.getPrioridad()+", "+
                    odmsj.getIPMsj()+", "+
                    odmsj.getNombreAgente()+", "+
                    odmsj.getMensaje());
    }
    
    public synchronized void agregaMsg(cIfxDatosMSJ odmsj)
    {
        oagentes.buscarAgente(odmsj.getNombreAgente()).addOMsj(odmsj);
        
        /*int nagente =buscaAgente(odmsj.getNombreAgente());
        if(nagente>=0)
        {
           oagentes[nagente].addOMsj(odmsj);             
        }*/
        
    }
    /*public synchronized int buscaAgente(String nnombre)
    {
        int i=-1;
        for( i=0;i<oagentes.length;i++)
        {
            if(oagentes[i].getNombre().equals(nnombre))
                return i;
                
        }
        return -1;
        
    }*/
    ///
    
    
}
